/**
 * @author Q
 * @create 2025-05-29-9:25
 */

/**
 * 5.SpringIoc&DI
 *      2.Ioc&DI使用
 *      3.Ioc详解
 *      4.DI详解
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 总结
         *      Spring, Spring Boot 和Spring MVC的关系以及区别
         */
    }
    public static void main2(String[] args) {
        /**
         * 4.DI详解
         *      1.属性注入，创建属性，使用@Autowired
         *      2.setter注入:创建set方法，使用@Autowired
         *      3.构造方法注入
         *          1.如果存在无参构造方法，需要使用@Autowired
         *      4.区别：
         *          属性注⼊
         *              优点: 简洁，使⽤⽅便；
         *              缺点:
         *                 只能⽤于 IoC 容器，如果是⾮ IoC 容器不可⽤，并且只有在使⽤的时候才会出现 NPE（空指针异常）
         *                 不能注⼊⼀个Final修饰的属性
         *         构造函数注⼊(Spring 4.X推荐)
         *             优点:
                             可以注⼊final修饰的属性
                             注⼊的对象不会被修改
                             依赖对象在使⽤前⼀定会被完全初始化，因为依赖是在类的构造⽅法中执⾏的，⽽构造⽅法
                             是在类加载阶段就会执⾏的⽅法.
                             通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的
                        缺点:
                            注⼊多个对象时, 代码会⽐较繁琐
                    setter注⼊(Spring 3.X推荐)
                         优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊
                         缺点:
                         不能注⼊⼀个Final修饰的属性
                         注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险
                5.@Autowired存在的问题
                    1.@primary
                        存在多个bean方法，使用该注解，默认实现一个bean方法
                    2.@Qualifier
                        指定注入对象，需要配合@Autowired进行使用
                    3.Resource
                        按照bean名称注入，name属性指定注入的bean名称
                     常⻅⾯试题:
                     @Autowird 与 @Resource的区别
                     • @Autowired 是spring框架提供的注解，⽽@Resource是JDK提供的注解
                     • @Autowired 默认是按照类型注⼊，⽽@Resource是按照名称注⼊. 相⽐于 @Autowired 来说，
                     @Resource ⽀持更多的参数设置，例如 name 设置，根据名称获取 Bean。
         */
    }
    public static void main1(String[] args) {
        /**
         * 3.Ioc详解
         *      1.Bean存储
         *          类注解：@Controller @Service @Repository @Component @Configuration
         *          方法注解：@Bean
         *          1.@Controller(控制器存储)
         *              1.获取bean对象的三种方式（常用）
         *                  1.通过bean类型
         *                  2.通过bean名（类名称的首字母小写）
         *                  3.通过bean类型+bean名
         *          2.@Service(服务存储)
         *          3，@Repository(仓库存储)
         *       2.为什么有这麽多的注解？
         *          不同注解作用不同
         *          1.@Controller:控制层，接收请求，对请求进行处理，并进行响应（与前端交互）
         *          2.@Service:业务逻辑层，处理具体业务逻辑（根据前端要求进行编写代码）
         *          3.@Repository:数据访问层，负责数据访问操作（访问数据库）
         *          4.Configuration:配置层，配置代码中配置信息
         *          5.关系：这些注解被称为 @Component 的衍⽣注解
         *       3.方法注解@Bean
         *          运用场景：
         *              1.使用外部包里的类，无法使用类注解
         *              2.需要多个数据源
         *          1.方法注解需要配合类注解使用
         *              一般类注解使用@Component/@Configuration
         *          2.定义多个对象
         *              可以同时定义多个数据源
         *              1.不能同时访问多个数据源
         *              2.bean方法名，是方法注解的方法名
         *       4.重命名Bean
         *          1.重命名一个时，(name={"重命名名"})
         *          2.只有一个对象时，可以省略name={}
         *       5.扫描路径
         *              默认扫描的范围是SpringBoot启动类所在包及其⼦包
         *              推荐做法:
         *              把启动类放在我们希望扫描的包的路径下, 这样我们定义的bean就都可以被扫描到
         */
    }
}
